package com.whz.bus.debezium;

import com.google.common.collect.Sets;
import com.whz.generic.uuid.UuidUtils;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.Set;

@Data
@ConfigurationProperties("bus.debezium")
public class DebeziumProperties {

    /**
     * 只是监听数据的变化,不监听结构的变化
     */
    private boolean onlyMonitorDataChanged = true;

    /**
     * debezium是否集群使用.集群:偏移量保存在nacos;单机:保存在本地文件
     */
    private Cluster cluster = new Cluster();

    /**
     * mysql config
     */
    private Mysql mysql = new Mysql();

    /**
     * pg config
     */
    private Postgres postgres = new Postgres();


    /**
     * pg的配置与mysql稍有不同
     */
    @Data
    public static class Postgres {

        /**
         * 用于监听的数据库
         */
        private String database;

        /**
         * 订阅的schema,mysql一般不会用到
         */
        private Set<String> schema = Sets.newHashSet();

        /**
         * 订阅的tables,注意此处是表的全名且与mysql不同,即'<schemaName>.<tableName>.'
         */
        private Set<String> tables = Sets.newHashSet();
    }

    /**
     * mysql的特殊配置
     */
    @Data
    public static class Mysql {

        /**
         * 订阅的数据库,mysql可以多个,pg中只有一个
         */
        private Set<String> database = Sets.newHashSet();

        /**
         * mysql 5.7+ 开启binlog同步时需要指定与集群中其他机器不重名的字符串,避免循环同步,单机时随机即可
         */
        private int serverId = UuidUtils.createNumberUid().intValue();

        /**
         * 订阅的tables,注意此处是表的全名,即'<databaseName>.<tableName>'
         */
        private Set<String> tables = Sets.newHashSet();
    }

    /**
     * 当debezium集群部署时需要下列配置
     */
    @Data
    public static class Cluster {
        /**
         * debezium集群部署
         */
        private boolean enable = false;
        /**
         * 集群的偏移量存储在nacos
         */
        private OffsetStore offsetStore = new OffsetStore();

        @Data
        public static class OffsetStore {
            /**
             * 保存binlog偏移量的nacos的dataId
             */
            private String dataId;
            /**
             * 保存binlog偏移量的nacos的group
             */
            private String group;

            /**
             * debezium默认60s提交一次binlog偏移量,感觉有点长了,改成15s
             */
            private int intervalMs = 15000;
        }
    }
}